﻿/*
Copyright (c) 2005-2008, CellAO Team

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    * Neither the name of the CellAO Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

using System;
using System.Collections.Generic;
using System.Text;
using AO.Core;

namespace ZoneEngine.PacketHandlers
{
    /// <summary>
    /// 
    /// </summary>
    class OrgClient
    {
        MySqlWrapper ms = new MySqlWrapper();

        /// <summary>
        /// 
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="client"></param>
        public void Read(byte[] packet, Client client)
        {
            PacketReader reader = new PacketReader(packet);

            Header header = reader.PopHeader();
            reader.PopByte();
            byte cmd = reader.PopByte();
            Identity target = reader.PopIdentity();
            int unknown = reader.PopInt();
            string CmdStr = "";
            byte CmdByte = 0;

            #region cmd args
            switch (cmd)
            {
                case 1:
                case 7:
                case 9:
                case 13:
                case 17:
                case 19:
                case 20:
                case 21:
                case 23:
                case 24:
                case 25:
                case 26:
                case 27:
                case 28:
                    short CmdStrLen = reader.PopShort();
                    CmdStr = reader.PopString((int)CmdStrLen);
                    break;
                case 10:
                    CmdByte = reader.PopByte();
                    break;
                default:
                    break;
            }
            reader.Finish();
            #endregion

            #region cmd handlers
            switch (cmd)
            {
                #region /org create <name>
                case 1:
                    {
                        // org create
                        /* client wants to create organization
                         * name of org is CmdStr
                         */

                        string SqlQuery = "SELECT * FROM organizations WHERE Name='" + CmdStr + "'";
                        string guild_name = null;
                        int orgID = 0;
                        ms.MySqlRead(SqlQuery);
                        while (ms.myreader.Read())
                        { guild_name = ms.myreader.GetString("Name"); }
                        if (guild_name == null)
                        {
                            client.SendChatText("You have created the guild: " + CmdStr);
                            client.Character.orgName = CmdStr;
                            client.Character.WriteNames();

                            string CurrDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                            string SqlQuery2 = "INSERT INTO organizations (Name, creation, LeaderID, GovernmentForm) VALUES ('" + CmdStr + "', '" + CurrDate + "', '" + client.Character.characterId + "', '0')";
                            client.SendChatText("Query: " + SqlQuery2);
                            ms.MySqlInsert(SqlQuery2);
                            ms.mcc.Close();
                            string SqlQuery3 = "SELECT * FROM organizations WHERE Name='" + CmdStr + "'";
                            ms.MySqlRead(SqlQuery3);
                            while (ms.myreader.Read())
                            { orgID = ms.myreader.GetInt32("ID"); }
                            client.Character.stats.SetStat(48, 0);
                            client.Character.stats.SetStat(5, orgID);
                            ms.mcc.Close();
                            break;
                        }
                        else
                        {
                            client.SendChatText("This guild already <font color=#DC143C>exists</font>");
                            break;
                        }
                    }
                #endregion

                #region /org ranks
                case 2:
                    // org ranks
                    //Displays Org Rank Structure.
                    /* Select governingform from DB, Roll through display from GovForm */
                    break;
                #endregion

                #region /org contract
                case 3:
                    // org contract
                    break;
                #endregion

                #region unknown org command 4
                case 4:
                    break;
                #endregion

                #region /org info
                case 5:
                    {
                        Client t_player = null;
                        if (Misc.FindClient.FindClientByID((Server)client.Server, target.Instance, out t_player))
                        {
                            string orgDescription = "", orgObjective = "", orgHistory = "", orgLeaderName = "";
                            int orgGoverningForm = 0, orgLeaderID = 0;
                            ms.MySqlRead("SELECT * FROM organizations WHERE ID=" + t_player.Character.orgId);
                            while (ms.myreader.Read())
                            {
                                orgDescription = ms.myreader.GetString("Description");
                                orgObjective = ms.myreader.GetString("Objective");
                                orgHistory = ms.myreader.GetString("History");
                                orgGoverningForm = ms.myreader.GetInt32("GovernmentForm");
                                orgLeaderID = ms.myreader.GetInt32("LeaderID");
                            }
                            ms.mcc.Close();
                            ms.MySqlRead("SELECT Name FROM characters WHERE ID=" + orgLeaderID);
                            while (ms.myreader.Read())
                            {
                                orgLeaderName = ms.myreader.GetString("Name");
                            }
                            ms.mcc.Close();
                            string TextGovForm = null;
                            if (orgGoverningForm == 0) { TextGovForm = "Department"; }
                            else if (orgGoverningForm == 1) { TextGovForm = "Faction"; }
                            else if (orgGoverningForm == 2) { TextGovForm = "Republic"; }
                            else if (orgGoverningForm == 3) { TextGovForm = "Monarchy"; }
                            else if (orgGoverningForm == 4) { TextGovForm = "Anarchism"; }
                            else if (orgGoverningForm == 5) { TextGovForm = "Feudalism"; }
                            else { TextGovForm = "Department"; }
                            string orgRank = GetRank(orgGoverningForm, t_player.Character.stats.GetStat(48));
                            PacketWriter writer = new PacketWriter();
                            writer.PushBytes(new byte[] { 0xDF, 0xDF });
                            writer.PushShort(10);
                            writer.PushShort(1);
                            writer.PushShort(0);
                            writer.PushInt(3086);
                            writer.PushInt(client.Character.characterId);
                            writer.PushInt(0x64582A07);
                            writer.PushIdentity(50000, t_player.Character.characterId);
                            writer.PushByte(0);
                            writer.PushByte(2);    // OrgServer case 0x02 (Org Info)
                            writer.PushInt(0);
                            writer.PushInt(0);
                            writer.PushInt(0xDEAA); // Type (org)
                            writer.PushInt(t_player.Character.orgId);    // org ID
                            writer.PushShort((short)t_player.Character.orgName.Length);
                            writer.PushBytes(Encoding.ASCII.GetBytes(t_player.Character.orgName));
                            writer.PushShort((short)orgDescription.Length);
                            writer.PushBytes(Encoding.ASCII.GetBytes(orgDescription));
                            writer.PushShort((short)orgObjective.Length);
                            writer.PushBytes(Encoding.ASCII.GetBytes(orgObjective));
                            writer.PushShort((short)orgHistory.Length);
                            writer.PushBytes(Encoding.ASCII.GetBytes(orgHistory));
                            writer.PushShort((short)TextGovForm.Length);
                            writer.PushBytes(Encoding.ASCII.GetBytes(TextGovForm));
                            writer.PushShort((short)orgLeaderName.Length);
                            writer.PushBytes(Encoding.ASCII.GetBytes(orgLeaderName));
                            writer.PushShort((short)orgRank.Length);

                            writer.PushBytes(Encoding.ASCII.GetBytes(orgRank));
                            writer.Push3F1Count(0);
                            byte[] reply = writer.Finish();

                            client.CmpStream.Write(reply, 0, reply.Length);
                            client.CmpStream.Flush();
                        }
                    }
                    break;
                #endregion

                #region /org disband
                case 6:
                    {
                        // org disband
                        /* client wants to disband org
                         * has already clicked ok on confirm dialog */
                        string SqlQuery5 = "SELECT `" + client.Character.orgId + "` FROM characte_stats";

                        client.Character.stats.SetStat(5, 0);
                        ms.MySqlRead(SqlQuery5);
                        while (ms.myreader.Read())
                        {
                            string SqlQuery6 = "INSERT INTO character_stats (48) VALUES (0)";
                            ms.MySqlInsert(SqlQuery6);
                            ms.mcc.Close();
                        }
                        client.SendChatText("You have <font color=#DC143C>disbanded</font> your Organization, I hope you enjoy leaving all your friends without a guild!");
                    }
                    break;
                #endregion

                #region /org startvote <text> <duration> <entries>
                case 7:
                    // org startvote <"text"> <duration(minutes)> <entries>
                    // arguments (<text> <duration> and <entries>) are in CmdStr
                    break;
                #endregion

                #region /org vote info
                case 8:
                    // org vote info
                    break;
                #endregion

                #region /org vote <entry>
                case 9:
                    // <entry> is CmdStr
                    break;
                #endregion

                #region /org promote
                case 10:
                    // some arg in CmdByte. No idea what it is
                    break;
                #endregion

                #region /org demote
                case 11:
                    // demote target player
                    break;
                #endregion

                #region unknown org command 12
                case 12:
                    break;
                #endregion

                #region /org kick <name>
                case 13:
                    // kick <name> from org
                    // <name> is CmdStr
                    break;
                #endregion

                #region /org invite
                case 14:
                    // invite target to org
                    break;
                #endregion

                #region unknown org command 15
                case 15:
                    break;
                #endregion

                #region /org leave
                case 16:
                    // org leave
                    // TODO: Disband org if it was leader that left org. -Suiv-
                    client.Character.stats.SetStat(68, 0);
                    client.Character.stats.SetStat(5, 0);
                    client.SendChatText("You left the guild");
                    break;
                #endregion

                #region /org tax | /org tax <tax>
                case 17:
                    // gets or sets org tax
                    // <tax> is CmdStr
                    // if no <tax>, then just send chat text with current tax info
                    break;
                #endregion

                #region /org bank
                case 18:
                    {
                        // org bank
                        ms.MySqlRead("SELECT * FROM orginizations WHERE ID=" + client.Character.orgId);
                        while (ms.myreader.Read())
                        {
                            Int32 bank_credits = ms.myreader.GetInt32("Bank");
                            client.SendChatText("Your bank has " + bank_credits + " credits in its account");
                            break;
                        }
                        ms.mcc.Close();
                    }
                    break;
                #endregion

                #region /org bank add <cash>
                case 19:
                    {
                        // org bank add <cash>
                        Int32 minuscredits_fromplayer = Convert.ToInt32(CmdStr);
                        ms.MySqlRead("SELECT * FROM `character_stats` where ID=" + client.Character.characterId);
                        while (ms.myreader.Read())
                        {
                            int characters_credits = ms.myreader.GetInt32("64");
                            if (characters_credits < minuscredits_fromplayer)
                            {
                                client.SendChatText("You do not have enough Credits");
                                break;
                            }
                            else
                            {
                                int total_Creditsspent = characters_credits - minuscredits_fromplayer;

                                client.Character.stats.SetStat(60, total_Creditsspent);
                                ms.MySqlInsert("INSERT INTO organizations (Bank) VALUES (" + minuscredits_fromplayer + ")");
                                ms.MySqlInsert("INSERT INTO character_stats  (60) VALUES (" + total_Creditsspent + ")");
                                client.SendChatText("You have donated " + minuscredits_fromplayer + " to your guild, Thank you for supporting your local guild");
                                ms.mcc.Close();
                                break;
                            }
                        }
                    }
                    break;
                #endregion

                #region /org bank remove <cash>
                case 20:
                    // org bank remove <cash>
                    // <cash> is CmdStr
                    // player wants to take credits from org bank
                    // only leader can do that
                    break;
                #endregion

                #region /org bank paymembers <cash>
                case 21:
                    // <cash> is CmdStr
                    // give <cash> credits to every org member
                    // credits are taken from org bank
                    // only leader can do it
                    break;
                #endregion

                #region /org debt
                case 22:
                    // send player text about how big is his/her tax debt to org
                    break;
                #endregion

                #region /org history <text>
                case 23:
                    {
                        // org history <history text>
                        ms.MySqlUpdate("UPDATE organizations SET history = '" + CmdStr + "' WHERE ID = '" + client.Character.stats.GetStat(5) + "'");
                        client.SendChatText("History Updated");
                        ms.mcc.Close();
                    }
                    break;
                #endregion

                #region /org objective <text>
                case 24:
                    {
                        // org objective <objective text>
                        ms.MySqlUpdate("UPDATE organizations SET objective = '" + CmdStr + "' WHERE ID = '" + client.Character.stats.GetStat(5) + "'");
                        client.SendChatText("Objective Updated");
                        ms.mcc.Close();
                    }
                    break;
                #endregion

                #region /org description <text>
                case 25:
                    {
                        // org description <description text>
                        ms.MySqlUpdate("UPDATE organizations SET description = '" + CmdStr + "' WHERE ID = '" + client.Character.stats.GetStat(5) + "'");
                        client.SendChatText("Description Updated");
                        ms.mcc.Close();
                    }
                    break;
                #endregion

                #region /org name <text>
                case 26:
                    {
                        // org name <name>
                        /* Renames Organization
                         * Checks for Existing Orgs with similar name to stop crash
                         * Chaz
                         */
                        string SqlQuery26 = "SELECT * FROM organizations WHERE Name LIKE '" + CmdStr + "' LIMIT 1";
                        string CurrentOrg = null;
                        ms.MySqlRead(SqlQuery26);
                        while (ms.myreader.Read())
                        {
                            CurrentOrg = ms.myreader.GetString("Name");
                        }
                        if (CurrentOrg == null)
                        {
                            string SqlQuery27 = "UPDATE organizations SET Name = '" + CmdStr + "' WHERE ID = '" + client.Character.stats.GetStat(5) + "'";
                            ms.MySqlUpdate(SqlQuery27);
                            ms.mcc.Close();
                            client.SendChatText("Organization Name Changed to: " + CmdStr);
                            client.Character.orgName = CmdStr;
                            client.Character.WriteNames();
                            break;
                        }
                        else
                        {
                            client.SendChatText("An Organization already exists with that name");
                            break;
                        }
                    }
                #endregion

                #region /org governingform <text>
                case 27:
                    {
                        // org governingform <form>
                        /* Current Governing Forms:
                         * Department, Faction, Republic, Monarchy, Anarchism, Feudalism
                         */
                        //Check on whether your President or not
                        if (client.Character.stats.GetStat(48) == 0)
                        {
                            //first we drop the case on the input, just to be sure.
                            Int32 GovFormNum = -1;
                            if (CmdStr == null)
                            {
                                //list gov forms
                                client.SendChatText("List of Accepted Governing Forms is: department, faction, republic, monarchy, anarchism, feudalism");
                                break;
                            }
                            //was correct input passed?
                            switch (CmdStr.ToLower())
                            {
                                case "department":
                                    GovFormNum = 0;
                                    break;
                                case "faction":
                                    GovFormNum = 1;
                                    break;
                                case "republic":
                                    GovFormNum = 2;
                                    break;
                                case "monarchy":
                                    GovFormNum = 3;
                                    break;
                                case "anarchism":
                                    GovFormNum = 4;
                                    break;
                                case "feudalism":
                                    GovFormNum = 5;
                                    break;
                                default:
                                    client.SendChatText(CmdStr + " Is an invalid Governing Form!");
                                    client.SendChatText("Accepted Governing Forms are: department, faction, republic, monarchy, anarchism, feudalism");
                                    break;
                            }
                            if (GovFormNum != -1)
                            {
                                ms.MySqlUpdate("UPDATE organizations SET GovernmentForm = '" + GovFormNum + "' WHERE ID = '" + client.Character.stats.GetStat(5) + "'");
                                client.SendChatText("Governing Form is now: " + CmdStr);
                                break;
                            }
                        }
                        else
                        {
                            //Haha! You're not the org leader!
                            client.SendChatText("You must be the Org Leader to perform this command");
                            break;
                        }
                    }
                    break;
                #endregion

                #region /org stopvote <text>
                case 28:
                    // <text> is CmdStr
                    break;
                #endregion

                #region unknown command
                default:
                    break;
                #endregion
            }
            #endregion

            reader.Finish();
        }
        internal static string GetRank(int GoverningForm, int Rank)
        {
            string[] Department = { "President", "General", "Squad Commander", "Unit Commander", "Unit Leader", "Unit Member", "Applicant" };
            string[] Faction = { "Director", "Board Member", "Executive", "Member", "Applicant" };
            string[] Republic = { "President", "Advisor", "Veteran", "Member", "Applicant" };
            string[] Monarchy = { "Monarch", "Council", "Follower" };
            string[] Anarchism = { "Anarchist" };
            string[] Feudalism = { "Lord", "Knight", "Vassal", "Peasant" };

            switch (GoverningForm)
            {
                case 0:
                    if (Rank > 6) { return ""; }
                    return Department[Rank];
                case 1:
                    if (Rank > 4) { return ""; }
                    return Faction[Rank];
                case 2:
                    if (Rank > 4) { return ""; }
                    return Republic[Rank];
                case 3:
                    if (Rank > 2) { return ""; }
                    return Monarchy[Rank];
                case 4:
                    if (Rank > 0) { return ""; }
                    return Anarchism[Rank];
                case 5:
                    if (Rank > 3) { return ""; }
                    return Feudalism[Rank];
                default:
                    // 	wrong governingform (too high number)
                    return "";
            }
        }
    }
}
